package com.srmt.document.feishu.internal.table.impl.sheet;

import com.lark.oapi.service.docx.v1.model.*;
import com.srmt.document.exception.TableException;
import com.srmt.document.feishu.internal.table.model.TableContext;
import com.srmt.document.feishu.internal.table.util.SheetCoordinateHelper;
import com.srmt.feishu.client.FeishuClient;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 电子表格结构操作
 *
 * 封装所有与Sheet结构修改相关的操作，包括：
 * - 单元格合并
 * - 单元格取消合并
 *
 * @author srmt
 * @since 3.0.0
 */
public class SheetStructureOperations {

    private static final Logger logger = LoggerFactory.getLogger(SheetStructureOperations.class);

    private final FeishuClient client;

    public SheetStructureOperations(FeishuClient client) {
        if (client == null) {
            throw new IllegalArgumentException("客户端不能为null");
        }
        this.client = client;
    }

    /**
     * 合并单元格
     *
     * @param context 表格上下文
     * @param startRow 起始行索引（1-based）
     * @param startCol 起始列索引（1-based）
     * @param endRow 结束行索引（1-based）
     * @param endCol 结束列索引（1-based）
     * @throws TableException 操作失败时抛出
     */
    public void mergeCells(TableContext context, int startRow, int startCol,
                          int endRow, int endCol) throws TableException {
        logger.debug("合并工作表中的单元格[{},{} 到 {},{}]",
                    startRow, startCol, endRow, endCol);

        Block tableBlock = context.getTableBlock();
        if (tableBlock.getSheet() == null) {
            throw new TableException("块中未找到电子表格信息");
        }

        String token = tableBlock.getSheet().getToken();
        if (token == null || token.isEmpty()) {
            throw new TableException("电子表格令牌为空");
        }

        try {
            // 解析token获取spreadsheetToken和sheetId
            String[] parts = SheetCoordinateHelper.parseSheetToken(token);
            String spreadsheetToken = parts[0];
            String sheetId = parts[1];

            // 如果sheetId为空，需要获取默认sheet的ID
            if (sheetId.isEmpty()) {
                // querySheets现在直接返回Sheet[]，失败时抛出FeishuApiException
                com.lark.oapi.service.sheets.v3.model.Sheet[] sheets =
                    client.sheets().querySheets(spreadsheetToken);

                if (sheets != null && sheets.length > 0) {
                    sheetId = sheets[0].getSheetId();
                } else {
                    throw new TableException("无法确定电子表格的工作表ID: " + spreadsheetToken);
                }
            }

            // 使用 client.sheets().mergeCells() 方法
            // 该方法已被限流和重试装饰器包装，无需直接使用 SheetsV2ApiClient
            logger.debug("合并工作表{}中的单元格[{},{} 到 {},{}]",
                        sheetId, startRow, startCol, endRow, endCol);

            // 调用合并单元格API（自动应用限流和重试）
            boolean success = client.sheets().mergeCells(
                spreadsheetToken, sheetId, startRow, startCol, endRow, endCol);

            if (!success) {
                throw new TableException("在工作表中合并单元格失败");
            }

            logger.info("成功合并工作表中的单元格[{},{} 到 {},{}]",
                       startRow, startCol, endRow, endCol);

        } catch (TableException e) {
            throw e;
        } catch (Exception e) {
            throw new TableException("在工作表中合并单元格失败: " + e.getMessage());
        }
    }

    /**
     * 取消合并单元格
     *
     * @param context 表格上下文
     * @param startRow 起始行索引（1-based）
     * @param startCol 起始列索引（1-based）
     * @param endRow 结束行索引（1-based）
     * @param endCol 结束列索引（1-based）
     * @throws TableException 操作失败时抛出
     */
    public void unmergeCells(TableContext context, int startRow, int startCol,
                            int endRow, int endCol) throws TableException {
        logger.debug("取消合并工作表中的单元格[{},{} 到 {},{}]",
                    startRow, startCol, endRow, endCol);

        Block tableBlock = context.getTableBlock();
        if (tableBlock.getSheet() == null) {
            throw new TableException("块中未找到电子表格信息");
        }

        String token = tableBlock.getSheet().getToken();
        if (token == null || token.isEmpty()) {
            throw new TableException("电子表格令牌为空");
        }

        try {
            // 解析token获取spreadsheetToken和sheetId
            String[] parts = SheetCoordinateHelper.parseSheetToken(token);
            String spreadsheetToken = parts[0];
            String sheetId = parts[1];

            // 如果sheetId为空，需要获取默认sheet的ID
            if (sheetId.isEmpty()) {
                // querySheets现在直接返回Sheet[]，失败时抛出FeishuApiException
                com.lark.oapi.service.sheets.v3.model.Sheet[] sheets =
                    client.sheets().querySheets(spreadsheetToken);

                if (sheets != null && sheets.length > 0) {
                    sheetId = sheets[0].getSheetId();
                } else {
                    throw new TableException("无法确定电子表格的工作表ID: " + spreadsheetToken);
                }
            }

            // 使用 client.sheets().unmergeCells() 方法
            // 该方法已被限流和重试装饰器包装，无需直接使用 SheetsV2ApiClient
            logger.debug("取消合并工作表{}中的单元格[{},{} 到 {},{}]",
                        sheetId, startRow, startCol, endRow, endCol);

            // 调用取消合并单元格API（自动应用限流和重试）
            boolean success = client.sheets().unmergeCells(
                spreadsheetToken, sheetId, startRow, startCol, endRow, endCol);

            if (!success) {
                throw new TableException("在工作表中取消合并单元格失败");
            }

            logger.info("成功取消合并工作表中的单元格[{},{} 到 {},{}]",
                       startRow, startCol, endRow, endCol);

        } catch (TableException e) {
            throw e;
        } catch (Exception e) {
            throw new TableException("在工作表中取消合并单元格失败: " + e.getMessage());
        }
    }
}
